<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        // 借用构造函数继承 + 原型对象的深拷贝

        // function Dog(name, age) {
        //     this.name = name;
        //     this.age = age;
        //     this.type = '狗';
        // }

        // Dog.prototype.say = function () {
        //     console.log('汪');
        // }



        // function KeJi(name, age, color) {
        //     this.name = name ;
        //     this.age = age ;
        //     this.color = color;

        // }


        // // 中间件继承
        // function Fn() {}
        // Fn.prototype = Dog.prototype ;


        // // 继承父类prototype上的方法
        // KeJi.prototype = new Fn() ;



        // 寄生式继承组合继承
        function Dog(name, age) {
            this.name = name;
            this.age = age;
            this.type = '狗';
        }

        Dog.prototype.say = function () {
            console.log('汪');
        }



        // function KeJi(name, age, color) {

        //     // 借用构造函数
        //     Dog.call(this , name , age) ;

        //     this.color = color;

        // }


        // // 中间件继承
        // function Fn() {}
        // // Fn 的prototype和Dog的prototype地址共享    Fn不做他用
        // Fn.prototype = Dog.prototype ;

        // KeJi.prototype = new Fn() ;

        // function ff() {

        //     function KeJi(name, age, color) {

        //         // 借用构造函数
        //         Dog.call(this, name, age);

        //         this.color = color;

        //     }


        //     // 中间件继承
        //     function Fn() { }
        //     // Fn 的prototype和Dog的prototype地址共享    Fn不做他用
        //     Fn.prototype = Dog.prototype;

        //     KeJi.prototype = new Fn();

        //     return KeJi
        // }

        // const KeJi = ff() ;




        const KeJi = (function () {
            function KJ(name, age, color) {

                // 借用构造函数
                Dog.call(this, name, age);

                this.color = color;

            }


            // 中间件继承
            function Fn() { }
            // Fn 的prototype和Dog的prototype地址共享    Fn不做他用
            Fn.prototype = Dog.prototype;

            KeJi.prototype = new Fn();

            return KJ;   // 返回了构造函数KeJi
        })()


        const k = new KeJi('旺财', 2, '白色');
        console.log(k);





    </script>

</body>

</html>